
import { RouteRecordRaw } from "vue-router";

let firstMenu :any = null
export function mapMenusToRoutes(userMenus:any[]):RouteRecordRaw[] {
    //存放 和用户目录一样的route
    const routes : RouteRecordRaw[] = []
    
    //先去默认加载所有的路由
    const allRoutes : RouteRecordRaw[] = []
    const routeFiles = require.context('../router/main',true,/\.ts/)
    routeFiles.keys().forEach(key => {
        //将路径进行处理
        const route = require( '../router/main' + key.split('.')[1])
        // console.log(route);
        allRoutes.push(route.default)
        
    });
    //根据 menus 里面的 type 进行判断，如果为 1 ，则查找里面的children 的type
    // 如果 type 为 2 ，则查找对应理由关系
    // 使用递归函数
    const _recurseGetRoute = (menus:any[]) => {
        // 将menus 里面的值 进行遍历
        for(const menu of menus){
            if(menu.type === 2 ){
                // 类型为 2 ，则在allroutes 里面找到对应的路径
                const route = allRoutes.find((router)=> router.path === menu.url)
                if(route) routes.push(route)
                //将第一个映射的路由，进行存储，方便刚进入main的时候，进行路由跳转
                if(!firstMenu) {
                    firstMenu = menu
                }
            }else{
                _recurseGetRoute(menu.children)
            }

        }
    }
    //调用递归函数，将上面传递的用户菜单传递进去
    _recurseGetRoute(userMenus)
    return routes
}

// 通过路径的匹配，来得到当前页面路径所在的 id 号
export function pathMapToMenu(userMenu:any[],currentPath:string ,bread?:any) :any {
    
    for( const menu of userMenu){
        if(menu.type===1){
            const findResult = pathMapToMenu(menu.children ?? [],currentPath)
            //如果第二次递归调用函数的话，有值进行返回
            if(findResult){
                //给面包屑里面放一二级导航
                bread?.push({name:menu.name})
                bread?.push({name:findResult.name})
                return findResult
            }
        }else if(menu.type === 2 && menu.url === currentPath) {
            // console.log(menu.id);
            return menu
        }
    }
}

// 在上面的函数中，将 bread 作为可选参数传递进去，然后赋值，在 return 参数出来
// 获取面包屑函数
export function pathMapBread (userMenu:any[],currentPath:string ){
    //存储面包屑导航
    const bread :any= []
    pathMapToMenu( userMenu,currentPath,bread)
    return bread
}

// 通过 menu 返回的按钮权限来判断 按钮是否可用
export function mapMenusToPermission( userMenus:any[]){
    const permission:any[] = []
    const _recurseGetPermission = (menus:any[])=>{
        for(const menu of menus){
            if(menu.type !== 3 ){
                _recurseGetPermission(menu.children??[])
            }else {
                permission.push(menu.permission)
            }
        }
    }
    //调用函数
    _recurseGetPermission(userMenus)
    return permission
}

//匹配最底层的子节点

export function mapMenuLeafKeys(menuList:any[]){

    const leafKeys:number[] = []
    const _recurseGetKeys = (menuList:any[])=>{
        for(const item of menuList){
            if(item.children){
                _recurseGetKeys(item.children)
            }else {
                leafKeys.push(item.id)
            }
        }
    }
    _recurseGetKeys(menuList)

    return leafKeys
}
export {firstMenu}